#include "debug.h"
#include "../DDIC/AllDDIC.h"

extern void GenW_PANEL_normal_SPI_Write_code(u8 SPI_Mode,u8 channel ,u8 para[]);
extern u8 GenR_PANEL_SPI4_Read_u8_Data(u8 SPI_Mode,u8 channel,u8 reg,u8 para[],u8 back_num);

/*RM9300 Gamma?????*/
u8 RM091_Gamma_r[54]= {
    0x00,0x01, 0x02,0x03, 0x04,0x05, 0x06,0x07, 0x08,0x09, 0x0A,0x0B, 0x0C,0x0D, 0x0E,0x0F, 0x10,0x11,
    0x12,0x13, 0x14,0x15, 0x16,0x17, 0x18,0x19, 0x1A,0x1B, 0x1C,0x1D, 0x1E,0x1F, 0x20,0x21, 0x22,0x23,
	  0x24,0x25, 0x26,0x27, 0x28,0x29, 0x2A,0x2B, 0x2D,0x2F, 0x30,0x31, 0x32,0x33, 0x34,0x35, 0x36,0x37, 
};
u8 RM091_Gamma_g[54]= {   
	  0x38,0x39, 0x3A,0x3B, 0x3D,0x3F, 0x40,0x41, 0x42,0x43, 0x44,0x45, 0x46,0x47, 0x48,0x49, 0x4A,0x4B,
    0x4C,0x4D, 0x4E,0x4F, 0x50,0x51, 0x52,0x53, 0x54,0x55, 0x56,0x58, 0x59,0x5A, 0x5B,0x5C, 0x5D,0x5E,
    0x5F,0x60, 0x61,0x62, 0x63,0x64, 0x65,0x66, 0x67,0x68, 0x69,0x6A, 0x6B,0x6C, 0x6D,0x6E, 0x6F,0x70,		
};
u8 RM091_Gamma_b[54]={
	  0x71,0x72, 0x73,0x74, 0x75,0x76, 0x77,0x78, 0x79,0x7A, 0x7B,0x7C, 0x7D,0x7E, 0x7F,0x80, 0x81,0x82,
	  0x83,0x84, 0x85,0x86, 0x87,0x88, 0x89,0x8A, 0x8B,0x8C, 0x8D,0x8E, 0x8F,0x90, 0x91,0x92, 0x93,0x94,
	  0x95,0x96, 0x97,0x98, 0x99,0x9A, 0x9B,0x9C, 0x9D,0x9E, 0x9F,0xA0, 0xA2,0xA3, 0xA4,0xA5, 0xA6,0xA7,
};

u8 RM091_Gamma_r1[27]= {
		0x00,0x01, 0x02,0x03, 0x04,0x05, 0x06,0x07, 0x08,0x09, 0x0A,0x0B, 0x12,0x13, 0x1C,0x1D, 0x20,0x21,
		0x24,0x25, 0x28,0x29, 0x2D,0x2F, 0x36,0x37,  
};
u8 RM091_Gamma_g1[54]= {   
		0x38,0x39, 0x3A,0x3B, 0x3D,0x3F, 0x40,0x41, 0x42,0x43, 0x44,0x45, 0x4C,0x4D, 0x56,0x58, 0x5B,0x5C,
		0x5F,0x60, 0x63,0x64, 0x67,0x68, 0x6F,0x70,		
};
u8 RM091_Gamma_b1[54]={
		0x71,0x72, 0x73,0x74, 0x75,0x76, 0x77,0x78, 0x79,0x7A, 0x7B,0x7C, 0x83,0x84, 0x8D,0x8E, 0x91,0x92,
		0x95,0x96, 0x99,0x9A, 0x9D,0x9E, 0xA6,0xA7,
};
u8 RM091_Gamma3_r1[54]={
	  0x00,0x01, 0x02,0x03, 0x04,0x05, 0x06,0x07, 0x08,0x09, 0x0A,0x0B, 0x0C,0x0D, 0x0E,0x0F, 0x10,0x11,
		0x12,0x13, 0x14,0x15, 0x16,0x17, 0x18,0x19,
};
u8 RM091_Gamma3_g1[54]={
		0x1A,0x1B, 0x1C,0x1D, 0x1E,0x1F, 0x20,0x21, 0x22,0x23, 0x24,0x25, 0x26,0x27, 0x28,0x29, 0x2A,0x2B,
		0x2D,0x2F, 0x30,0x31, 0x32,0x33, 0x34,0x35
};
u8 RM091_Gamma3_b1[54]={
		0x36,0x37, 0x38,0x39, 0x3A,0x3B, 0x3D,0x3F, 0x40,0x41, 0x42,0x43, 0x44,0x45, 0x46,0x47, 0x48,0x49,
		0x4A,0x4B, 0x4C,0x4D, 0x4E,0x4F, 0x50,0x51
};

u8 RM091_otptime=0;
//u8 RM35x_otptime=0;
void RM69091_Write_Register(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
    if((SigMode == SPI3_Mode)||(SigMode == SPI4_Mode))          //3线 4线8bit SPI 模式
    {
        GenW_PANEL_SPI_Write_code_cuihuashan(SigMode,channel,buffer);  
    }
    else if((SigMode == Video_Mode)||(SigMode == CMD_Mode))
    {
        if(SigMode != CMD_Mode)
            SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0010)&0XFFFD);
        delay_ms(5);
        SSD2828_W_Array(SigMode,channel,buffer,2);
        delay_ms(50);
        SSD2828_W_Reg(SigMode,channel,0xB7,HS_B7_Data);
    }
    buffer[4] = Uart_Error_None;
    STM2PC(pdev,CDC_IN_EP,buffer,buffer[2]+3);           //返回 写寄存器状态  ：ok  
}
void RM69091_Read_Register(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
    if((SigMode == SPI3_Mode)||(SigMode == SPI4_Mode))          //3线 4线8bit SPI 模式
    {
        switch(buffer[3]&0x0F)
        {
            case 0x00:      ////CMD1 read function
                SPI_PANEL_Write_code(SigMode,channel,0xfe,0x00);
								SPI4_PANEL_Read_u8_Data_cuihuashan_page_Alan(SigMode,channel,buffer[3],buffer[4],buffer,buffer[5]); 
                delay_ms(5);
                STM2PC(pdev,CDC_IN_EP,buffer,(buffer[2])+3);           //返回 读取的 寄存器数据  ：ok  
                break;
            
            default :   ////CMD2 read function
                //buffer[4] = SPI4_PANEL_Read_u8_Data_page(SigMode,channel,buffer[4],buffer[3]); 
								buffer[5] = SPI4_PANEL_Read_u8_Data_cuihuashan_page(SigMode,channel,buffer[3],buffer[4]);
                delay_ms(5);
                STM2PC(pdev,CDC_IN_EP,buffer,(buffer[2])+3);           //返回 读取的 寄存器数据  ：ok  
                break;
        }

    }
    else if((SigMode == Video_Mode)||(SigMode == CMD_Mode))
    {
        if(SigMode == Video_Mode)  //RGB+SPI= MIPI
            SSD2828_W_Reg(SigMode,channel,0xB7,((HS_B7_Data|0x0010)&0XFFFD)|0x0080);      
        else
            SSD2828_W_Reg(SigMode,channel,0xB7,LP_B7_Data|0x0080);
        delay_ms(5);
        SSD2828_W_Reg(SigMode,channel,0xC1,0x0002); 
        SSD2828_W_Reg(SigMode,channel,0xC0,0x0001); 
        SSD2828_W_Reg(SigMode,channel,0xBC,0x0001);
        SSD2828_W_Reg(SigMode,channel,0xBD,0x0000);                                    
        for(i=0;i<3;i++)
        {
            SSD2828_W_Cmd(SigMode,channel,0xBF);
            SSD2828_W_Data(SigMode,channel,buffer[3]);
            if(SigMode == Video_Mode)  //RGB+SPI= MIPI   
                SSD2828_W_Reg(SigMode,channel,0xD4,0x00FA);  
            delay_ms(25);
            buffer[4]=SSD2828_R_Reg(SigMode,channel,0xFF);
        }                              
        SSD2828_W_Reg(SigMode,channel,0xB7,HS_B7_Data);
        delay_ms(5);
        STM2PC(pdev,CDC_IN_EP,buffer,buffer[2]+3);           //返回 读取的 寄存器数据  ：ok  	
    }
}


void RM69091_Write_Gamma(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data);
void RM69091_Read_Gamma(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data);
void RM69091_Gamma_OTP_Start(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data,u8 RM091_otptime);
void RM69091_auto_Gamma(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data);

//----------------------------------------------RM69091----------------------------------------------
void RM69091_Write_Gamma(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
	 if((SigMode !=SPI4_Mode)&&(SigMode !=SPI3_Mode))
	 {
				u8 buffer1[5];
				SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0410)&0XFFFD);	
				 // SSD2828_W_Reg(SigMode,channel,0xB7,(LP_B7_Data|0x0010)&0XFFfd);              0000 0000   01 00   000 0
				delay_ms(5);

				if((buffer[3]&0x03) == 0x00)
				{
						buffer1[0] = 0x02;
						buffer1[1] = 0xFE;
						buffer1[2] = 0x02;                // GAMMA1  page1
						SSD2828_W_Array(SigMode,channel,buffer1,0);
				}
			
				else if((buffer[3]&0x03) == 0x01)
				{  
						buffer1[0] = 0x02;
						buffer1[1] = 0xFE;
						buffer1[2] = 0x03;                // GAMMA2  page7
						SSD2828_W_Array(SigMode,channel,buffer1,0);
				}   
				else if((buffer[3]&0x03) == 0x02)
				{
						buffer1[0] = 0x02;
						buffer1[1] = 0xFE;
						buffer1[2] = 0x0D;                // GAMMA3  page8
						SSD2828_W_Array(SigMode,channel,buffer1,0);
				}
				if((buffer[3]&0x80) == 0x80) //27绑点
				{
						buffer1[0] = 0x02;	
						buffer1[1] = 0xAB;
						buffer1[2] = 0x01;  
				}
				else
				{
						buffer1[0] = 0x02; //13绑点
						buffer1[1] = 0xAB;
						buffer1[2] = 0x81;  		
				}	
				SSD2828_W_Array(SigMode,channel,buffer1,0); 	
				
			

				for( i = 0;i<buffer[2]-1;i++) 
				{	 
					 if((buffer[3]&0x03) == 0x00 || (buffer[3]&0x03) == 0x01)
					 {
							if((buffer[3]&0x80) == 0x80){
								 if     ((buffer[3]&0x70)==0x10) SSD2828_W_Reg(SigMode,channel,0xBF,(u16)(buffer[i+4]<<8)|RM091_Gamma_r[i]);  
								 else if((buffer[3]&0x70)==0x20) SSD2828_W_Reg(SigMode,channel,0xBF,(u16)(buffer[i+4]<<8)|RM091_Gamma_g[i]); 
								 else if((buffer[3]&0x70)==0x30) SSD2828_W_Reg(SigMode,channel,0xBF,(u16)(buffer[i+4]<<8)|RM091_Gamma_b[i]); 
							}
							else{
								 if     ((buffer[3]&0x70)==0x10) SSD2828_W_Reg(SigMode,channel,0xBF,(u16)(buffer[i+4]<<8)|RM091_Gamma_r1[i]);  
								 else if((buffer[3]&0x70)==0x20) SSD2828_W_Reg(SigMode,channel,0xBF,(u16)(buffer[i+4]<<8)|RM091_Gamma_g1[i]); 
								 else if((buffer[3]&0x70)==0x30) SSD2828_W_Reg(SigMode,channel,0xBF,(u16)(buffer[i+4]<<8)|RM091_Gamma_b1[i]); 
							}    				
					 }		
						else if((buffer[3]&0x03) == 0x02)
						{
								 if     ((buffer[3]&0x70)==0x10) SSD2828_W_Reg(SigMode,channel,0xBF,(u16)(buffer[i+4]<<8)|RM091_Gamma3_r1[i]);  
								 else if((buffer[3]&0x70)==0x20) SSD2828_W_Reg(SigMode,channel,0xBF,(u16)(buffer[i+4]<<8)|RM091_Gamma3_g1[i]); 
								 else if((buffer[3]&0x70)==0x30) SSD2828_W_Reg(SigMode,channel,0xBF,(u16)(buffer[i+4]<<8)|RM091_Gamma3_b1[i]); 
						}
					delay_ms(3);
				}
				
				SSD2828_W_Reg(SigMode,channel,0xB7,HS_B7_Data);
				
//				buffer1[0] = 0x02;
//				buffer1[1] = 0xFE;
//				buffer1[2] = 0x00;                // GAMMA1  page0
//				SSD2828_W_Array(SigMode,channel,buffer1,0);
				
				buffer[4] = Uart_Error_None;
				STM2PC(pdev,CDC_IN_EP,buffer,buffer[2]+3);           //?? ?Gamma??  :ok  
	 }
	 else
	 {
				u8 buffer1[3];		 

				if((buffer[3]&0x03) == 0x00)
				{
						buffer1[0] = 0x02;
						buffer1[1] = 0xFE;
						buffer1[2] = 0x02;                // GAMMA1  page1
				}
			
				else if((buffer[3]&0x03) == 0x01)
				{  
						buffer1[0] = 0x02;
						buffer1[1] = 0xFE;
						buffer1[2] = 0x03;                // GAMMA2  page7
				}   
				else if((buffer[3]&0x03) == 0x02)
				{
						buffer1[0] = 0x02;
						buffer1[1] = 0xFE;
						buffer1[2] = 0x0D;                // GAMMA3  page8
				}
				GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 
				delay_ms(5);
				if((buffer[3]&0x80) == 0x80) //27绑点
				{
						buffer1[0] = 0x02;	
						buffer1[1] = 0xAB;
						buffer1[2] = 0x01;  
				}
				else
				{
						buffer1[0] = 0x02; //13绑点
						buffer1[1] = 0xAB;
						buffer1[2] = 0x81;  		
				}	
				GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 	
				delay_ms(5);
			  

				for( i = 0;i<buffer[2]-1;i++) 
				{	 
					 buffer1[0] = 0x02;
				   buffer1[2] = buffer[i+4];
					 if((buffer[3]&0x03) == 0x00 || (buffer[3]&0x03) == 0x01)
					 {
							if((buffer[3]&0x80) == 0x80)
							{
									 if((buffer[3]&0x70)==0x10) 
									 { 									 						
										  buffer1[1] = RM091_Gamma_r[i];					       	   										 										
									 }									 
									 else if((buffer[3]&0x70)==0x20) 
									 {									 								  									 						
											buffer1[1] = RM091_Gamma_g[i];					       	   										 																				 
									 } 
									 else if((buffer[3]&0x70)==0x30) 
									 {
											buffer1[1] = RM091_Gamma_b[i];					       	   										 												
									 }
									  	
							}
							else
							{
									if((buffer[3]&0x70)==0x10) 
									{
											buffer1[1] = RM091_Gamma_r1[i];		
									}
									else if((buffer[3]&0x70)==0x20)
									{
											buffer1[1] = RM091_Gamma_g1[i];	
									}
									else if((buffer[3]&0x70)==0x30)
									{
											buffer1[1] = RM091_Gamma_b1[i];	
								  }
							}
						}    								 		
						else if((buffer[3]&0x03) == 0x02)
						{
								 if((buffer[3]&0x70)==0x10) 
								 {
								     buffer1[1] = RM091_Gamma3_r1[i];	
								 }
								 else if((buffer[3]&0x70)==0x20)
								 {
									   buffer1[1] = RM091_Gamma3_g1[i];	
							   }
								 else if((buffer[3]&0x70)==0x30) 
								 {
								     buffer1[1] = RM091_Gamma3_b1[i];	
								 }								  
						}
						GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 
					  delay_ms(3);
				}				
				buffer[4] = Uart_Error_None;
				STM2PC(pdev,CDC_IN_EP,buffer,buffer[2]+3);           //?? ?Gamma??  :ok  
	 }	   
		//RM69091_w_end: ;
}

void RM69091_Read_Gamma(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
	if((SigMode == SPI4_Mode)||(SigMode == SPI3_Mode))
	{
		    u8 buffer1[3];
		    u8 buffer2[3];
				buffer1[0] = 0x02;
				if((buffer[3]&0x03) == 0x00)      //Gamma1 
				{  
						buffer1[1] = 0xFE;
						buffer1[2] = 0x02;      
				}
				else if((buffer[3]&0x03) == 0x01) //Gamma2 
				{  
						buffer1[1] = 0xFE;       
						buffer1[2] = 0x03;      
				}
				else if((buffer[3]&0x03) == 0x02) //Gamma3 
				{  
						buffer1[1] = 0xFE;        
						buffer1[2] = 0x0D;      
				}
				GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 
				delay_ms(15);		
				if((buffer[3]&0x80) == 0x80) //27绑点
				{
						buffer1[0] = 0x02;	
						buffer1[1] = 0xAB;
						buffer1[2] = 0x01;  
				}
				else
				{
						buffer1[0] = 0x02; //13绑点
						buffer1[1] = 0xAB;
						buffer1[2] = 0x81;  		
				}	
				GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 
				delay_ms(15);
				for( i = 0;i<buffer[2]-1;i++)			 	
				{  	
						buffer1[0] = 0x02; //13绑点
						buffer1[1] = 0xC1;
						buffer1[2] = 0x02; 
				  	GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1);                               
						buffer1[0] = 0x01;
					
					 if((buffer[3]&0x03) == 0x00 || (buffer[3]&0x03) == 0x01)
					 {
								if((buffer[3]&0x80) == 0x80)
								{
										 if((buffer[3]&0x70)==0x10) 
										 { 									 						
												buffer1[1] = RM091_Gamma_r[i];					       	   										 										
										 }									 
										 else if((buffer[3]&0x70)==0x20) 
										 {									 								  									 						
												buffer1[1] = RM091_Gamma_g[i];					       	   										 																				 
										 } 
										 else if((buffer[3]&0x70)==0x30) 
										 {
												buffer1[1] = RM091_Gamma_b[i];					       	   										 												
										 }
												
								}
								else
								{
										if((buffer[3]&0x70)==0x10) 
										{
												buffer1[1] = RM091_Gamma_r1[i];		
										}
										else if((buffer[3]&0x70)==0x20)
										{
												buffer1[1] = RM091_Gamma_g1[i];	
										}
										else if((buffer[3]&0x70)==0x30)
										{
												buffer1[1] = RM091_Gamma_b1[i];	
										}
								}
						}    								 		
						else if((buffer[3]&0x03) == 0x02)
						{
								 if((buffer[3]&0x70)==0x10) 
								 {
								     buffer1[1] = RM091_Gamma3_r1[i];	
								 }
								 else if((buffer[3]&0x70)==0x20)
								 {
									   buffer1[1] = RM091_Gamma3_g1[i];	
							   }
								 else if((buffer[3]&0x70)==0x30) 
								 {
								     buffer1[1] = RM091_Gamma3_b1[i];	
								 }								  
						}
						
				if((buffer[3]&0x03) == 0x00)      //Gamma1 
				{  					
  		                                                                          //  PAGE     地址      
						buffer[4+i] = SPI4_PANEL_Read_u8_Data_cuihuashan_page(SigMode,channel,0X02,buffer1[1]);     
				}
				else if((buffer[3]&0x03) == 0x01) //Gamma2 
				{  
			                                                                          //  PAGE     地址      
						buffer[4+i] = SPI4_PANEL_Read_u8_Data_cuihuashan_page(SigMode,channel,0X03,buffer1[1]);     
				}
				else if((buffer[3]&0x03) == 0x02) //Gamma3 
				{  
			                                                                          //  PAGE     地址     
						buffer[4+i] = SPI4_PANEL_Read_u8_Data_cuihuashan_page(SigMode,channel,0X0D,buffer1[1]); 
				}
						delay_ms(6);     
				}	
				delay_ms(5);
				SSD2828_W_Reg(SigMode,channel,0xB7,HS_B7_Data);
	}
  else
  {
    
		    u8 buffer1[3];
				buffer1[0] = 0x02;
				if((buffer[3]&0x03) == 0x00)      //Gamma1 
				{  
						buffer1[1] = 0xFE;
						buffer1[2] = 0x02;      
				}
				else if((buffer[3]&0x03) == 0x01) //Gamma2 
				{  
						buffer1[1] = 0xFE;       
						buffer1[2] = 0x03;      
				}
				else if((buffer[3]&0x03) == 0x02) //Gamma3 
				{  
						buffer1[1] = 0xFE;        
						buffer1[2] = 0x0D;      
				}
				SSD2828_W_Array(SigMode,channel,buffer1,0);
				delay_ms(15);		
				if((buffer[3]&0x80) == 0x80) //27绑点
				{
						buffer1[0] = 0x02;	
						buffer1[1] = 0xAB;
						buffer1[2] = 0x01;  
				}
				else
				{
						buffer1[0] = 0x02; //13绑点
						buffer1[1] = 0xAB;
						buffer1[2] = 0x81;  		
				}	
				SSD2828_W_Array(SigMode,channel,buffer1,0);
				delay_ms(15);
				SSD2828_W_Reg(SigMode,channel,0xB7,LP_B7_Data|0x0080); 
				SSD2828_W_Reg(SigMode,channel,0xBC,0x0001);	
				for( i = 0;i<buffer[2]-1;i++)			 	
				{  	
						SSD2828_W_Reg(SigMode,channel,0xC1,0x0002);                                
						buffer1[0] = 0x01;
					if((buffer[3]&0x03) == 0x00 || (buffer[3]&0x03) == 0x01)
					{
						if((buffer[3]&0x80) == 0x80)
						{
							buffer1[1] = ((buffer[3]&0x70)==0x10) ? RM091_Gamma_r[i] : (((buffer[3]&0x70)==0x20) ? RM091_Gamma_g[i] : RM091_Gamma_b[i]);
						}
						else
						{
							buffer1[1] = ((buffer[3]&0x70)==0x10) ? RM091_Gamma_r1[i] : (((buffer[3]&0x70)==0x10) ? RM091_Gamma_g1[i] : RM091_Gamma_b1[i]);
						}
					}
					else if((buffer[3]&0x03) == 0x02)
					{
						buffer1[1] = ((buffer[3]&0x70)==0x10) ? RM091_Gamma3_r1[i] : (((buffer[3]&0x70)==0x20) ? RM091_Gamma3_g1[i] : RM091_Gamma3_b1[i]);
					}
						SSD2828_W_Array(SigMode,channel,buffer1,0); 
						delay_ms(6);
						buffer[4+i]=SSD2828_R_Reg(SigMode,channel,0xFF);        
				}	
				delay_ms(5);
				SSD2828_W_Reg(SigMode,channel,0xB7,HS_B7_Data);
				
//			buffer1[0] = 0x02;
//			buffer1[1] = 0xFE;
//			buffer1[2] = 0x00;                // GAMMA1  page0
//			SSD2828_W_Array(SigMode,channel,buffer1,0);
  }	
    STM2PC(pdev,CDC_IN_EP,buffer,buffer[2]+3);           //?? ??? Gamma??  :ok  
	 
}




void RM69091_Gamma_OTP_Start(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data,u8 RM091_otptime)
{
	if((SigMode !=SPI4_Mode)&&(SigMode !=SPI3_Mode))
	{
				u8 buffer1[3];  
				SSD2828_W_Reg(SigMode,channel,0xB7,LP_B7_Data);  
				delay_ms(5);
				buffer1[0] = 0x02;
				buffer1[1] = 0xFE;
				buffer1[2] = 0x00;
				SSD2828_W_Array(SigMode,channel,buffer1,0);     // UCS????
				delay_ms(5);
				buffer1[0] = 0x02;
				buffer1[1] = 0x28;
				buffer1[2] = 0x00;
				SSD2828_W_Array(SigMode,channel,buffer1,0);     // ??? 
				delay_ms(100);  //otp
				buffer1[0] = 0x02;
				buffer1[1] = 0xFE;
				buffer1[2] = 0x01; 
				SSD2828_W_Array(SigMode,channel,buffer1,0);     //Page0
				buffer1[0] = 0x02;
			
			
				if(buffer[3] == 0x00)				//OTP page 10 20 40 70 90 
				{
						buffer1[1] = 0xF0;///0xF6
						buffer1[2] = 0xA6;////0x08	    			
						SSD2828_W_Array(SigMode,channel,buffer1,0);     //  
					
						buffer1[1] = 0xF6;///0xF6
						buffer1[2] = 0x4C;////0x08	    			
						SSD2828_W_Array(SigMode,channel,buffer1,0);     //  
				}
				else if(buffer[3] == 0x10)		//otp page10
				{
						buffer1[1] = 0xF6;
						buffer1[2] = 0x04;
						SSD2828_W_Array(SigMode,channel,buffer1,0);
				}
				else if(buffer[3] == 0x20)	//otp page20
				{
						buffer1[1] = 0xF6;
						buffer1[2] = 0x08;
						SSD2828_W_Array(SigMode,channel,buffer1,0);			
				}
				else if(buffer[3] == 0x30)	//otp page30
				{
						buffer1[1] = 0xF6;
						buffer1[2] = 0x10;
						SSD2828_W_Array(SigMode,channel,buffer1,0);		
				}
				else if(buffer[3] == 0x40)	//otp page40
				{
						buffer1[1] = 0xF0;
						buffer1[2] = 0xA0;
						SSD2828_W_Array(SigMode,channel,buffer1,0);			
				}
				else if(buffer[3] == 0x50)	//otp page50
				{
						buffer1[1] = 0xF0;
						buffer1[2] = 0x10;
						SSD2828_W_Array(SigMode,channel,buffer1,0);				
				}
				else if(buffer[3] == 0x60)	//otp page60
				{
						buffer1[1] = 0xF0;
						buffer1[2] = 0x08;
						SSD2828_W_Array(SigMode,channel,buffer1,0);			
				}
				else if(buffer[3] == 0x70)	//otp page70
				{
						buffer1[1] = 0xF0;
						buffer1[2] = 0x04;
						SSD2828_W_Array(SigMode,channel,buffer1,0);	
				}
				else if(buffer[3] == 0x90)	//otp page90
				{
						buffer1[1] = 0xF6;
						buffer1[2] = 0x40;
						SSD2828_W_Array(SigMode,channel,buffer1,0);		
				}

				buffer1[0] = 0x02;//MTPCTR
				buffer1[1] = 0xF2;
				buffer1[2] = 0x03;
				SSD2828_W_Array(SigMode,channel,buffer1,0);    
			
				buffer1[0] = 0x02;
				buffer1[1] = 0xF3;
				buffer1[2] = 0xA5;
				SSD2828_W_Array(SigMode,channel,buffer1,0);  

				buffer1[0] = 0x02;
				buffer1[1] = 0xF4;
				buffer1[2] = 0x5A;
				SSD2828_W_Array(SigMode,channel,buffer1,0);  

				buffer1[0] = 0x02;
				buffer1[1] = 0xF5;
				buffer1[2] = 0x3C;
				SSD2828_W_Array(SigMode,channel,buffer1,0);  			
	}
	else
	{
	    	u8 buffer1[3];  
				buffer1[0] = 0x02;
				buffer1[1] = 0xFE;
				buffer1[2] = 0x00;
		    GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 
				delay_ms(5);
				buffer1[1] = 0x28;
				buffer1[2] = 0x00;
	    	GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 
				delay_ms(100);  //otp
				buffer1[1] = 0xFE;
				buffer1[2] = 0x01; 
		    GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 
			
			
				if(buffer[3] == 0x00)				//OTP page 10 20 40 70 90 
				{
						buffer1[1] = 0xF0;///0xF6
						buffer1[2] = 0xA6;////0x08	    			
					  GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 
					
						buffer1[1] = 0xF6;///0xF6
						buffer1[2] = 0x4C;////0x08	    			
					  GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 
				}
				else if(buffer[3] == 0x10)		//otp page10
				{
						buffer1[1] = 0xF6;
						buffer1[2] = 0x04;
					  GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 
				}
				else if(buffer[3] == 0x20)	//otp page20
				{
						buffer1[1] = 0xF6;
						buffer1[2] = 0x08;	
            GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 					
				}
				else if(buffer[3] == 0x30)	//otp page30
				{
						buffer1[1] = 0xF6;
						buffer1[2] = 0x10;
					  GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 
				}
				else if(buffer[3] == 0x40)	//otp page40
				{
						buffer1[1] = 0xF0;
						buffer1[2] = 0xA0;
					  GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 
				}
				else if(buffer[3] == 0x50)	//otp page50
				{
						buffer1[1] = 0xF0;
						buffer1[2] = 0x10;		
					  GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 
				}
				else if(buffer[3] == 0x60)	//otp page60
				{
						buffer1[1] = 0xF0;
						buffer1[2] = 0x08;
            GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 					
				}
				else if(buffer[3] == 0x70)	//otp page70
				{
						buffer1[1] = 0xF0;
						buffer1[2] = 0x04;
					  GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 
				}
				else if(buffer[3] == 0x90)	//otp page90
				{
						buffer1[1] = 0xF6;
						buffer1[2] = 0x40;	
					  GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 
				}

				buffer1[0] = 0x02;//MTPCTR
				buffer1[1] = 0xF2;
				buffer1[2] = 0x03;
        GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 				
			
				buffer1[1] = 0xF3;
				buffer1[2] = 0xA5;
        GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 				

				buffer1[1] = 0xF4;
				buffer1[2] = 0x5A;
				GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 

				buffer1[1] = 0xF5;
				buffer1[2] = 0x3C;
				GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 
		
	}
    		
                      
    delay_ms(1500);         // wait for >400 ms   
    buffer[4] = Uart_Error_Oth;
    STM2PC(pdev,CDC_IN_EP,buffer,buffer[2]+3);           //?? ?OTP??  :ok
}
void RM69091_auto_Gamma(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
	
			if((SigMode !=SPI4_Mode)&&(SigMode !=SPI3_Mode))
			{
							//	u8 buffer1[3];
							//SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0410)&0XFFFD);	
							SSD2828_W_Reg(SigMode,channel,0xB7,LP_B7_Data);
							delay_ms(5);	

						
					//		buffer1[0] = 0x02;
					//		buffer1[1] = 0xFE;
					//		buffer1[2] = 0x02;              // GAMMA1  page1
					//		SSD2828_W_Array(SigMode,channel,buffer1,0);	
							SSD2828_W_Reg(SigMode,channel,0xBC,0x02);
						
							for( i = 0;i<buffer[2];i++) 
							{	 
											SSD2828_W_Reg(SigMode,channel,0xBF,(u16)(buffer[i+4]<<8)|buffer[i+3]);  

											i++;
											delay_ms(2);
							}				
							SSD2828_W_Reg(SigMode,channel,0xB7,HS_B7_Data);	
			}
			else
			{				
							u8 buffer1[3];
							buffer1[0] = 0x02;
							for( i = 0;i<buffer[2];i++) 
							{	 
											buffer1[1] = buffer[i+3];
											buffer1[2] = buffer[i+4];
											GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 
											i++;
											delay_ms(2);
							}				
			 }

}


void ProcessForIc58( USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8 buffer[],u16 LP_B7_Data,u16 HS_B7_Data)//ADD BY PCS
{
switch(buffer[1]&0xFF)
		{
        case 0x01:                                      //????
				RM69091_Write_Register(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data);
				break;
				case 0x02:                                      //????
				RM69091_Read_Register(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data);
				break;
				case 0x08:                                      //?Gamma
        RM69091_Write_Gamma(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data);
        break;
        case 0x09:                                      //?Gamma
        RM69091_Read_Gamma(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data); 
        break;
				case 0x07:
        RM69091_Gamma_OTP_Start(pdev,ep_addr,SigMode ,channel,buffer, LP_B7_Data,HS_B7_Data,RM091_otptime);//???
				break;
				case 0xDD:           // auto Gamma
        RM69091_auto_Gamma(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data);
        break;
				default:break;
	}	
	
}
